//
// Created by Administrator on 2020/9/18.
//

#ifndef STUN_HEADER_H
#define STUN_HEADER_H

#include <string>
#include <vector>
#include "stun.h"

extern uint16_t ntoh16(const uint16_t& input);
extern uint32_t ntoh32(const uint32_t& input);
extern uint64_t ntoh64(const uint64_t& input);

//STUN Header RFC-8489
//0                   1                   2                   3
//0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//|0 0|    STUN Message Type    |          Message Length       |
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//|                        Magic Cookie                         |
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//|                                                             |
//|                    Transaction ID (96 bits)                 |
//|                                                             |
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

class StunMessageHeader{
public:
    static constexpr uint32_t StunHeaderLength = 20;
    static constexpr uint32_t StunTrIdLength = 12;
    static constexpr uint32_t StunMagicCookie  = 0x2112A442;

    StunMessageHeader();
    StunMessageHeader(uint16_t);
    StunMessageHeader(const StunMessageHeader&);
    StunMessageHeader& operator=(const StunMessageHeader&);
    StunMessageHeader(const StunMessageHeader&&) noexcept = delete ;
    StunMessageHeader& operator=(const StunMessageHeader&&) noexcept = delete;
    ~StunMessageHeader();

    void set_msg_type(const uint16_t&);
    uint16_t get_msg_type() const;

    void set_transaction_tid(const char* buffer, uint8_t len);
    uint8_t * get_transaction_tid() ;

    bool parse(const char*, uint16_t);

    uint16_t encode(char*, uint16_t);

    void transaction_tid_init();

    char* encode16(char* buf, uint16_t data);

    char* encode32(char* buf, uint32_t data);

    uint16_t get_msg_length();

private:
    uint16_t msg_type_;
    uint16_t msg_length_;
    uint32_t magic_cookie_;
    uint8_t transaction_tid_[StunTrIdLength];
};

#endif //P2PCLIENT_STUN_HEADER_H

